Get Bitcoin data

btc <- getSymbols(Symbols="BTC-CAD", auto.assign=FALSE)
## remove today
btc <- btc[1:nrow(btc)-1,]
summary(btc)
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2019-09-18   Min.   : 6996   Min.   : 7439   Min.   : 5721  
##  1st Qu.:2020-02-20   1st Qu.:11519   1st Qu.:11711   1st Qu.:11314  
##  Median :2020-07-24   Median :13564   Median :13785   Median :13271  
##  Mean   :2020-07-24   Mean   :25072   Mean   :25772   Mean   :24293  
##  3rd Qu.:2020-12-26   3rd Qu.:33748   3rd Qu.:35091   3rd Qu.:33310  
##  Max.   :2021-05-30   Max.   :79624   Max.   :81446   Max.   :77726  
##                       NA's   :4       NA's   :4       NA's   :4      
##  BTC-CAD.Close   BTC-CAD.Volume      BTC-CAD.Adjusted
##  Min.   : 6931   Min.   :1.625e+10   Min.   : 6931   
##  1st Qu.:11519   1st Qu.:2.935e+10   1st Qu.:11519   
##  Median :13567   Median :4.528e+10   Median :13567   
##  Mean   :25115   Mean   :4.983e+10   Mean   :25115   
##  3rd Qu.:34036   3rd Qu.:6.410e+10   3rd Qu.:34036   
##  Max.   :79598   Max.   :4.471e+11   Max.   :79598   
##  NA's   :4       NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(btc))

btc45d <- tail(btc, n=45)
summary(btc45d[,1:4])
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2021-04-16   Min.   :41798   Min.   :43964   Min.   :37107  
##  1st Qu.:2021-04-27   1st Qu.:51847   1st Qu.:52563   1st Qu.:45708  
##  Median :2021-05-08   Median :65519   Median :67812   Median :60980  
##  Mean   :2021-05-08   Mean   :61378   Mean   :63231   Mean   :58138  
##  3rd Qu.:2021-05-19   3rd Qu.:69735   3rd Qu.:71450   3rd Qu.:66872  
##  Max.   :2021-05-30   Max.   :79368   Max.   :79831   Max.   :75503  
##  BTC-CAD.Close  
##  Min.   :41809  
##  1st Qu.:49186  
##  Median :64719  
##  Mean   :60568  
##  3rd Qu.:69605  
##  Max.   :77018
chart_Series(btc45d)

Get Ethereum data

eth <- getSymbols(Symbols="ETH-CAD", auto.assign=FALSE)
## remove today - empty
eth <- eth[1:nrow(eth)-1,]
summary(eth)
##      Index             ETH-CAD.Open     ETH-CAD.High     ETH-CAD.Low    
##  Min.   :2019-09-18   Min.   : 154.6   Min.   : 164.6   Min.   : 132.5  
##  1st Qu.:2020-02-20   1st Qu.: 244.7   1st Qu.: 250.9   1st Qu.: 240.3  
##  Median :2020-07-24   Median : 373.8   Median : 380.5   Median : 350.2  
##  Mean   :2020-07-24   Mean   : 883.1   Mean   : 919.5   Mean   : 842.8  
##  3rd Qu.:2020-12-26   3rd Qu.: 843.0   3rd Qu.: 915.9   3rd Qu.: 826.9  
##  Max.   :2021-05-30   Max.   :5050.3   Max.   :5267.4   Max.   :4588.7  
##                       NA's   :4        NA's   :4        NA's   :4       
##  ETH-CAD.Close    ETH-CAD.Volume      ETH-CAD.Adjusted
##  Min.   : 154.9   Min.   :6.923e+09   Min.   : 154.9  
##  1st Qu.: 244.8   1st Qu.:1.258e+10   1st Qu.: 244.8  
##  Median : 374.6   Median :1.862e+10   Median : 374.6  
##  Mean   : 887.1   Mean   :2.393e+10   Mean   : 887.1  
##  3rd Qu.: 876.6   3rd Qu.:3.010e+10   3rd Qu.: 876.6  
##  Max.   :5043.1   Max.   :1.025e+11   Max.   :5043.1  
##  NA's   :4        NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(eth))

Zoom in recent periods

  • 90d
eth90d <- tail(eth, n=90)
summary(eth90d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-03-02   Min.   :1885   Min.   :1959   Min.   :1841  
##  1st Qu.:2021-03-24   1st Qu.:2280   1st Qu.:2349   1st Qu.:2183  
##  Median :2021-04-15   Median :2730   Median :2922   Median :2583  
##  Mean   :2021-04-15   Mean   :2953   Mean   :3091   Mean   :2794  
##  3rd Qu.:2021-05-07   3rd Qu.:3335   3rd Qu.:3488   3rd Qu.:3157  
##  Max.   :2021-05-30   Max.   :5050   Max.   :5267   Max.   :4589  
##  ETH-CAD.Close 
##  Min.   :1886  
##  1st Qu.:2290  
##  Median :2756  
##  Mean   :2963  
##  3rd Qu.:3344  
##  Max.   :5043
chart_Series(eth90d)

  • 45d
eth45d <- tail(eth, n=45)
summary(eth45d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-04-16   Min.   :2535   Min.   :2849   Min.   :2097  
##  1st Qu.:2021-04-27   1st Qu.:2948   1st Qu.:3124   1st Qu.:2667  
##  Median :2021-05-08   Median :3344   Median :3504   Median :3182  
##  Mean   :2021-05-08   Mean   :3571   Mean   :3767   Mean   :3317  
##  3rd Qu.:2021-05-19   3rd Qu.:4226   3rd Qu.:4346   3rd Qu.:3952  
##  Max.   :2021-05-30   Max.   :5050   Max.   :5267   Max.   :4589  
##  ETH-CAD.Close 
##  Min.   :2546  
##  1st Qu.:2939  
##  Median :3358  
##  Mean   :3565  
##  3rd Qu.:4229  
##  Max.   :5043
chart_Series(eth45d)

Correlation: BTC, ETH

kryptos <- merge(btc, eth, join='outer', fill=NA)
kryptos2017 <- kryptos['2017-01-01/'] 
chart_Series(kryptos[,c(4,8)])

kryptos_all <- kryptos
kryptos <- kryptos["2017-01-01/"]
chart.Correlation(kryptos[,c(4,10)], histogram=TRUE)

Explore Correlation

df_kryptos <- as.data.frame(kryptos)
df_kryptos$date <- row.names(df_kryptos)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()

df_kryptos <- df_kryptos %>% mutate(
  yr=year(date),
  mth=month(date)
)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(yr)))+geom_point()

Correlations vary by year. Of most relevance in most recent yr correlation.

2020

df_kryptos_2020 <- df_kryptos %>% filter(date>='2020-01-01' & date<='2020-12-31')
df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

chart.Correlation(df_kryptos_2020[,c(2,3,4,5,8,9,10,11)], histogram=TRUE)

2021

df_kryptos_2021 <- df_kryptos %>% filter(date>='2021-01-01' & date<='2021-12-31')
df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

Distribution

2020

Prices

BTC
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_btc_ret <- dailyReturn(kryptos2020$BTC.CAD.Close)
dygraph(kryptos2020_btc_ret)
kryptos2020_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_btc_ret))

ETH
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_eth_ret <- dailyReturn(kryptos2020$ETH.CAD.Close)
dygraph(kryptos2020_eth_ret)
kryptos2020_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_eth_ret))

Combined
kryptos2020_ret <- merge(kryptos2020_btc_ret, kryptos2020_eth_ret, join='outer', fill=NA)

dygraph(kryptos2020_ret)
## convert to data frame for scatterplots etc
df_kryptos_2020_ret <- as.data.frame(kryptos2020_ret)
colnames(df_kryptos_2020_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2020_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2020_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2020_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2020_ret$ETH_ret), y=100, hjust= -0.2)

2021

Prices

BTC
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_btc_ret <- dailyReturn(kryptos2021$BTC.CAD.Close)
dygraph(kryptos2021_btc_ret)
kryptos2021_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_btc_ret))

ETH
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_eth_ret <- dailyReturn(kryptos2021$ETH.CAD.Close)
dygraph(kryptos2021_eth_ret)
kryptos2021_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_eth_ret))

Combined
kryptos2021_ret <- merge(kryptos2021_btc_ret, kryptos2021_eth_ret, join='outer', fill=NA)

dygraph(kryptos2021_ret)
## convert to data frame for scatterplots etc
df_kryptos_2021_ret <- as.data.frame(kryptos2021_ret)
colnames(df_kryptos_2021_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2021_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2021_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2021_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2021_ret$ETH_ret), y=100, hjust= -0.2)

PERIOD RETURNS

At the end of the day…what matters is what your return is at the end of the day. :)

df_kryptos_2021ytd <- df_kryptos_2021 %>% filter(date==min(date) | date==max(date)) %>% select(date, yr, mth, BTC.CAD.Close, ETH.CAD.Close) %>%
  mutate(BTC.CAD.ret=BTC.CAD.Close/lag(BTC.CAD.Close)-1,
         ETH.CAD.ret=ETH.CAD.Close/lag(ETH.CAD.Close)-1)

df_kryptos_2021ytd_lg <- df_kryptos_2021ytd %>% 
                          filter(date==max(date)) %>%
                          select(date, yr, mth, BTC.CAD.ret, ETH.CAD.ret) %>%
                          pivot_longer(cols=c(4:5),
                                      names_to='coin',
                                      values_to='ytd_return')

df_kryptos_2021ytd_lg %>% ggplot(aes(x=coin, y=ytd_return))+
                               geom_col()+
                              scale_y_continuous(labels=percent)

df_kryptos_2021ytd[,c(4:7)]
##            BTC.CAD.Close ETH.CAD.Close BTC.CAD.ret ETH.CAD.ret
## 2021-01-01      37393.09      929.7528          NA          NA
## 2021-05-30      43094.72     2887.1899   0.1524781    2.105331

MULTIPLE Currencies

Get data

ccurrency <- c("BTC-CAD", "ETH-CAD","LTC-CAD","BCH-CAD")

kryptos_multi <- NULL
for(c in ccurrency){
  kryptos_multi <- cbind(kryptos_multi,
                         getSymbols(Symbols=c, 
                                 from='2018-01-01', periodicity='daily', 
                                 auto.assign = FALSE)[,4])
}

Check correlations

chart.Correlation(kryptos_multi, histogram=TRUE)